import store from '@/store';
import Setting from '@/setting';
import util from '@/libs/util';
// import router from '../router'
import serverInfo from './websocket/serverInfo';
// import friendManger from './websocket/friendManger'
import previewHandle from './websocket/previewHandle';
import base64 from '@/libs/base64.js';
// import taskResultNotice from "./websocket/taskResultNotice";

import { Message } from 'view-design';
import conversationHandle from './websocket/conversationHandle';
// import circleNoticeHandle from './websocket/circleNoticeHandle'

let websocketUrl = 'ws://www.jjldkj.com:13088' // 默认地址
let WebSocketObj = null;
var lockReconnect = false; // 避免重复连接
var tt;
let linkTimes = 0; // 连接的次数 4次就提示连接失败
// 实例websocket
function createWebSocket() {
    console.log('自行')
    websocketUrl = `${Setting.websocketUrl}?access_token=${util.cookies.get('token')}`; // 默认地址
    WebSocketObj = new WebSocket(websocketUrl);
    linkTimes++;
    initWebSocket();
    let wechatInfo = localStorage.getItem('wechatInfo');
    console.log('wechatInfo', wechatInfo)
    setTimeout(() => {
        console.log('执行建立通道')
        let msg = {
            Id: 1010,
            AccessToken: '',
            MsgType: 'DeviceAuthReq',
            Content: {
                AuthType: 2,
                Credential: base64.b64EncodeUnicode(wechatInfo)
            }
        };
        sendSock(msg);
    }, 1000);
}

// 初始化事件函数
function initWebSocket() {
    WebSocketObj.onclose = () => {
        reconnect();
    };

    WebSocketObj.onerror = e => {
        if (linkTimes >= 4) {
            // console.log('重连连续失败3次，退出登陆')
            // 不再重连
            // let errMsg = {
            //     ErrorCode: 'websocket连接失败',
            //     ErrorMsg: `connection to ${websocketUrl} failed`
            // }
            // store.dispatch('SetRelogin', false)
            // store.dispatch('SetError', errMsg)
            // store.dispatch('SetDialog', 'ErrorPage')
        }
    };

    WebSocketObj.onopen = () => {
        // websocket打开
        // 重新登陆
        if (linkTimes > 1) {
            // let msg = store.getters.loginInfo
            // console.log('重新登陆:%s', linkTimes - 1)
            // console.log(msg)
            // sendSock(msg)
        } else {
            // 心跳检测重置
            heartCheck.start();
        }
    };

    WebSocketObj.onmessage = event => {
        // 拿到任何消息都说明当前连接是正常的
        linkTimes = 1;
        store.commit('power/export/changeWsIsConnect', true);
        heartCheck.start();
        handleMsg(event);
    };
}

/**
 * 尝试重连
 * @param url
 */
function reconnect() {
    // 如果账号在别的地方登陆 || 或者token过期就不再重连了 || 主动退出 都不再重连
    if (store.getters.relogin) {
        if (lockReconnect) return;
        lockReconnect = true;
        // 没连接上会一直重连，设置延迟避免请求过多
        tt && clearTimeout(tt);
        tt = setTimeout(function () {
            createWebSocket(websocketUrl);
            lockReconnect = false;
        }, 5000);
    } else {
        linkTimes = 0;
    }
}

// 心跳检测
var heartCheck = {
    timeout: 5000, // 心跳检测时长
    timeoutObj: null, //  定时变量
    serverTimeoutObj: null, // 服务器超时
    start: function () {
        if (WebSocketObj.readyState === 1) {
            var self = this;
            // 重置心跳
            this.timeoutObj && clearTimeout(this.timeoutObj);
            this.serverTimeoutObj && clearTimeout(this.serverTimeoutObj);
            this.timeoutObj = setTimeout(function () {
                // 这里发送一个心跳，后端收到后，返回一个心跳消息，
                let msg = {
                    Id: 1001,
                    MsgType: 'HeartBeatReq',
                    AccessToken: store.state.websocket.account.token
                };
                sendSock(msg);
                self.serverTimeoutObj = setTimeout(function () {
                    WebSocketObj.close();
                }, self.timeout);
            }, this.timeout);
        }
    }
};

// 数据接收处理
function handleMsg(e) {
    let msg = JSON.parse(e.data);
    let msgType = msg.msgType;
    switch (msgType) {
        // 退出登陆 2
        case 'DeviceExitNotice':
            serverInfo.deviceExitNoticeHandle(msg);
            break;
        // // 定时任务列表
        // case 'GetTaskInfoListResp':
        //     serverInfo.getTaskInfoListRespHandle(msg)
        //     break
        // // 商务列表
        // // case 'GetBuinessListResp':
        // //   serverInfo.getBuinessListRespHandle(msg)
        // //   break
        // // 公共话术
        // case 'GetCommonTermsResp':
        //     serverInfo.getCommonTermsRespHandle(msg)
        //     break
        // // 上传好友的备注
        // // case 'SaveFriendTagDetailResp':
        // //   serverInfo.saveFriendTagDetailRespHandle(msg)
        // //   break
        // // 指定好友的备注
        // // case 'GetWechatFriendDetailResp':
        // //   serverInfo.getWechatFriendDetailRespHandle(msg)
        // //   break
        // // 标签
        // case 'GetCommonTagsResp':
        //     serverInfo.getCommonTagsRespHandle(msg)
        //     break
        // // 历史消息
        // case 'QueryHistoryMessageResp':
        //     serverInfo.queryHistoryMessageRespHandle(msg)
        //     break
        // case 'HistoryMessageListResp':
        //     serverInfo.historyMessageListRespHandle(msg)
        //     break
        // // ====================================================================
        // 登陆结果
        case 'DeviceAuthRsp':
            previewHandle.deviceAuthRspHandle(msg);
            break;
        // // 微信列表
        case 'GetWeChatsRsp':
            previewHandle.getWeChatsRspHandle(msg);
            break;
        // // 微信登陆结果通知
        // case 'WeChatLoginNoticeResp':
        //     previewHandle.weChatLoginNoticeRespHandle(msg)
        //     break
        // 好友列表
        // case 'FriendPushNotice':
        //     previewHandle.friendPushNoticeHandle(msg)
        //     break
        // // 标签列表
        // case 'ContactLabelInfoNotice':
        //     previewHandle.contactLabelInfoNoticeHandle(msg)
        //     break
        // // ====================================================================
        // // 消息通知
        // case 'FriendTalkNotice':
        //     conversationHandle.friendTalkNoticeHandle(msg)
        //     break
        // // 会话列表推送
        case 'ConversationPushNotice':
            conversationHandle.conversationPushNoticeHandle(msg);
            break;
        // // 手机消息已读通知
        // case 'PostMessageReadNotice':
        //     conversationHandle.postMessageReadNoticeHandle(msg)
        //     break
        // // 账号强制下线通知
        // case 'AccountForceOfflineNotice':
        //     console.log('账号强制下线通知：AccountForceOfflineNotice')
        //     console.log(JSON.parse(msg.message))
        //     break
        // // 手机消息通知pc
        // case 'WeChatTalkToFriendNotice':
        //     conversationHandle.weChatTalkToFriendNoticeHandle(msg)
        //     break
        // // 获取聊天详情
        // case 'RequestTalkDetailTaskResultNotice':
        //     conversationHandle.requestTalkDetailTaskResultNoticeHandle(msg)
        //     break
        // 好友信息变更通知
        // case "FriendAddNotice":
        //     conversationHandle.friendAddNoticeHandle(msg);
        //     break;
        // // 好友删除通知
        // case 'FriendDelNotice':
        //     conversationHandle.friendDelNoticeHandle(msg)
        //     break
        // // 联系人标签新增|修改通知
        // case 'ContactLabelAddNotice':
        //     conversationHandle.contactLabelAddNoticeHandle(msg)
        //     break
        // // 标签删除通知
        // case 'ContactLabelDelNotice':
        //     conversationHandle.contactLabelDelNoticeHandle(msg)
        //     break
        // // 发消息结果通知
        // case 'TalkToFriendTaskResultNotice':
        //     conversationHandle.talkToFriendTaskResultNoticeHandle(msg)
        //     break
        // // 二维码
        // case 'PullWeChatQrCodeTaskResultNotice':
        //     conversationHandle.pullWeChatQrCodeTaskResultNoticeHandle(msg)
        //     break
        // // 收红包
        // case 'TakeMoneyTaskResultNotice':
        //     conversationHandle.takeMoneyTaskResultNoticeHandle(msg)
        //     break
        // // 历史消息推送
        // case 'HistoryMsgPushNotice':
        //     conversationHandle.historyMsgPushNoticeHandle(msg)
        //     break
        // // 公众号列表推送
        // case 'BizContactPushNotice':
        //     console.log('公众号列表推送:BizContactPushNotice')
        //     console.log(JSON.parse(msg.message))
        //     break
        // // ====================================================================
        // // 添加好友请求通知
        // case 'FriendAddReqeustNotice':
        //     friendManger.friendAddReqeustNoticeHandle(msg)
        //     break
        // // 新的朋友列表
        // case 'FriendAddReqListNotice':
        //     friendManger.friendAddReqListNoticeHandle(msg)
        //     break
        // // ==============================群相关======================================
        // // 推送群聊列表
        // case 'ChatroomPushNotice':
        //     conversationHandle.chatroomPushNoticeHandle(msg)
        //     break
        // // 群成员信息
        // case 'ChatRoomMembersNotice':
        //     conversationHandle.chatRoomMembersNoticeHandle(msg)
        //     break
        // // 群聊新增通知
        // case 'ChatRoomAddNotice':
        //     conversationHandle.chatRoomAddNoticeHandle(msg)
        //     break
        // // 群聊删除通知
        // case 'ChatRoomDelNotice':
        //     conversationHandle.chatRoomDelNoticeHandle(msg)
        //     break
        // // 群聊信息变更通知
        // case 'ChatRoomChangedNotice':
        //     conversationHandle.chatRoomChangedNoticeHandle(msg)
        //     break
        // // 群二维码
        // case 'PullChatRoomQrCodeTaskResultNotice':
        //     conversationHandle.pullChatRoomQrCodeTaskResultNoticeHandle(msg)
        //     break
        // // ==============================朋友圈相关======================================
        // // 发朋友圈的结果通知 ok
        // case 'PostSNSNewsTaskResultNotice':
        //     circleNoticeHandle.postSNSNewsTaskResultNoticeHandle(msg)
        //     break
        // // 主动获取微信的朋友圈的结果通知 ok
        // case 'CirclePushNotice':
        //     circleNoticeHandle.circlePushNoticeHandle(msg)
        //     break
        // // 删除朋友圈推送 ok
        // case 'CircleDelNotice':
        //     circleNoticeHandle.circleDelNoticeHandle(msg)
        //     break
        // // 新朋友圈推送 ok
        // case 'CircleNewPublishNotice':
        //     circleNoticeHandle.circleNewPublishNoticeHandle(msg)
        //     break
        // // 朋友圈大图 ok
        // case 'CircleDetailNotice':
        //     circleNoticeHandle.circleDetailNoticeHandle(msg)
        //     break
        // // 朋友圈点赞推送 ok
        // case 'CircleLikeNotice':
        //     circleNoticeHandle.circleLikeNoticeHandle(msg)
        //     break
        // // 朋友圈评论推送
        // case 'CircleCommentNotice':
        //     circleNoticeHandle.circleCommentNoticeHandle(msg)
        //     break
        // // 朋友圈评论结果通知
        // case 'CircleCommentReplyTaskResultNotice':
        //     circleNoticeHandle.circleCommentReplyTaskResultNoticeHandle(msg)
        //     break
        // // 朋友圈评论结果通知
        // case 'CircleCommentDeleteTaskResultNotice':
        //     circleNoticeHandle.circleCommentDeleteTaskResultNoticeHandle(msg)
        //     break
        // // 任务处理结果
        // case "TaskResultNotice":
        //     taskResultNotice.taskResultMap(msg);
        //     break;
        case 'WeChatLoginNotice':
            console.log('退出登陆通知：WeChatLoginNotice');
            console.log(JSON.parse(msg.message));
            break;
        // case 'WeChatOfflineNotice':
        //     previewHandle.weChatOfflineNoticeHandle(msg)
        //     break
        // case 'WeChatOnlineNotice':
        //     previewHandle.weChatOnlineNoticeHandle(msg)
        //     break
        case 'Error':
            let errMessage = JSON.parse(msg.message).ErrorMsg;
            if (errMessage == '账号密码错误') {
                localStorage.removeItem('wsInfo');
                store.dispatch('websocket/account/SetRelogin', 'false');
                store.dispatch('websocket/account/SetUser', {}); // 设置用户信息
                store.dispatch('websocket/account/SetToken', ''); // 设置token信息
                store.dispatch('websocket/account/SetLogin', false); // 修改登录状态
            } else if (JSON.parse(errMessage).errorMsg = '对方不在线') {
                let wechatsInfos = JSON.parse(localStorage.getItem('wechatsInfos'));
                for (let item of wechatsInfos) {
                    if (JSON.parse(errMessage).weChatId == item.WeChatId) {
                        Message.error({ content: `微信昵称：${item.WeChatname}不在线，请检查你的客服微信是否正常登录。`, duration: 3 });
                    }
                }
            } else {
                Message.error({ content: `${errMessage}`, duration: 3 });
            }
            break;
        // 服务端返回
        case 'MsgReceivedAck':
            switch (msg.refMsgId) {
                case 1001:
                    break;
                default:
                    // Message.success("操作成功");
                    break;
            }
            break;
        default:
            break;
    }
}

// 发送指令
function sendSock(agentData) {
    // 若是ws开启状态
    if (WebSocketObj && WebSocketObj.readyState === WebSocketObj.OPEN) {
        // 发送指令
        WebSocketObj.send(JSON.stringify(agentData));
    } else if (
        WebSocketObj &&
        WebSocketObj.readyState === WebSocketObj.CONNECTING
    ) {
        // 若是 正在开启状态，则等待1s后重新调用
        setTimeout(() => {
            sendSock(agentData);
        }, 1000);
    }
}

// 关闭websocket
function closeWebsocket() {
    if (WebSocketObj && WebSocketObj.readyState === WebSocketObj.OPEN) {
        WebSocketObj.close();
    }
}

export { sendSock, createWebSocket, closeWebsocket };
